home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / PROGRAMM / ASSEMBLE / H145.ZIP / ASXXXX_3.ZIP / I85MCH.C < prev    next >
C/C++ Source or Header  |  1990-07-18  |  2KB  |  177 lines

  1. /* i85mch.c */
  2.  
  3. /*
  4.  * (C) Copyright 1989,1990
  5.  * All Rights Reserved
  6.  *
  7.  * Alan R. Baldwin
  8.  * 721 Berkeley St.
  9.  * Kent, Ohio  44240
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <setjmp.h>
  14. #include "asm.h"
  15. #include "i8085.h"
  16.  
  17. /*
  18.  * Process machine ops.
  19.  */
  20. VOID
  21. machine(mp)
  22. struct mne *mp;
  23. {
  24.     register unsigned op, rd, rs;
  25.     struct expr e;
  26.  
  27.     op = mp->m_valu;
  28.     switch (mp->m_type) {
  29.  
  30.     case S_INH:
  31.         outab(op);
  32.         break;
  33.  
  34.     case S_RST:
  35.         rd = absexpr();
  36.         if (rd > 7)
  37.             aerr();
  38.         out3(op, rd);
  39.         break;
  40.  
  41.     case S_ADI:
  42.         expr(&e, 0);
  43.         outab(op);
  44.         outrb(&e, 0);
  45.         break;
  46.  
  47.     case S_ADD:
  48.         rd = reg();
  49.         if (rd > A)
  50.             aerr();
  51.         outab(op | rd);
  52.         break;
  53.  
  54.     case S_JMP:
  55.         expr(&e, 0);
  56.         outab(op);
  57.         outrw(&e, 0);
  58.         break;
  59.  
  60.     case S_INR:
  61.         rd = reg();
  62.         if (rd > A)
  63.             aerr();
  64.         out3(op, rd);
  65.         break;
  66.  
  67.     case S_LXI:
  68.         rd = reg();
  69.         comma();
  70.         expr(&e, 0);
  71.         out3(op, regpair(rd, SP));
  72.         outrw(&e, 0);
  73.         break;
  74.  
  75.     case S_LDAX:
  76.         rd = reg();
  77.         if (rd!=B && rd!=D)
  78.             aerr();
  79.         out3(op, rd);
  80.         break;
  81.  
  82.     case S_INX:
  83.         rd = reg();
  84.         out3(op, regpair(rd, SP));
  85.         break;
  86.  
  87.     case S_PUSH:
  88.         rd = reg();
  89.         out3(op, regpair(rd, PSW));
  90.         break;
  91.  
  92.     case S_MOV:
  93.         rd = reg();
  94.         comma();
  95.         rs = reg();
  96.         if (rs>A || rd>A)
  97.             aerr();
  98.         outab(op | rs | (rd<<3));
  99.         break;
  100.  
  101.     case S_MVI:
  102.         rd = reg();
  103.         comma();
  104.         expr(&e, 0);
  105.         if (rd > A)
  106.             aerr();
  107.         out3(op, rd);
  108.         outrb(&e, 0);
  109.         break;
  110.  
  111.     default:
  112.         err('o');
  113.     }
  114. }
  115.  
  116. /*
  117.  * Is the next character a comma ?
  118.  */
  119. VOID
  120. comma()
  121. {
  122.     if (getnb() != ',')
  123.         qerr();
  124. }
  125.  
  126. /*
  127.  * Output a | (b<<3);
  128.  */
  129. VOID
  130. out3(a, b)
  131. {
  132.     outab(a | (b<<3));
  133. }
  134.  
  135. /*
  136.  * Make sure that `r' is usable as a
  137.  * register pair specifier. The extra
  138.  * register (code 3) is `s'.
  139.  */
  140. int
  141. regpair(r, s)
  142. {
  143.     if (r < M) {
  144.         if (r&01)
  145.             aerr();
  146.     } else  if (r == s)
  147.         r = 6;
  148.     else
  149.         aerr();
  150.     return (r);
  151. }
  152.  
  153. /*
  154.  * Read a register name.
  155.  */
  156. int
  157. reg()
  158. {
  159.     register struct mne *mp;
  160.     char id[NCPS];
  161.  
  162.     getid(id, -1);
  163.     if ((mp = mlookup(id))==NULL || mp->m_type!=S_REG) {
  164.         aerr();
  165.         return (0);
  166.     }
  167.     return (mp->m_valu);
  168. }
  169.  
  170. /*
  171.  * Dummy machine specific init.
  172.  */
  173. VOID
  174. minit()
  175. {
  176. }
  177.